// src/services/ipGeoMap.ts

/** 接口1：国家节点数量统计 (用于地图热力着色) */
export interface CountryCountMap {
  [countryName: string]: number
}

/** 接口2：纯坐标点 (用于地图渲染点阵) */
export interface GeoCoordinate {
  latitude: number
  longitude: number
}

/** 接口3：后端返回的表格行数据结构，对应 /api/nodes-geo-map */
export interface RawNodeItem {
  // 核心标识信息
  ip: string
  node_type?: string

  // 新增字段
  forwarder_ip?: string
  access_method?: string

  // 地理位置
  location?: {
    latitude?: string | number
    longitude?: string | number
  }

  // 城市信息
  city?: {
    geoname_id?: number | string
    name?: string
    name_zh_cn?: string
  }

  // 国家信息
  country?: {
    geoname_id?: number | string
    iso_code?: string
    name?: string
    name_zh_cn?: string
  }

  // 网络信息（注意：字段名由 network -> ip_prefix）
  network?: {
    asn?: number | string
    asn_organization?: string
    ip_prefix?: string
  }

  // 大洲信息（目前前端未用到，先保留类型）
  continent?: {
    code?: string
    geoname_id?: number | string
    name?: string
    name_zh_cn?: string
  }
}

/** 接口3：后端返回的分页包裹结构 */
export interface NodeTableResponse {
  nodes: RawNodeItem[]
  total: number | string
}

/** 前端表格使用的规整化结构 */
export interface IpGeoTableItem {
  ip: string
  /** 原始 node_type，用来区分 forwarder / resolver */
  label: string
  /** 转发器 IP（如果有的话） */
  forwarderIp?: string | null
  /** 访问方式 */
  accessMethod?: string | null

  /** 城市 + 国家 展示 */
  location: string
  /** 国家展示（中文名 / 英文名 / ISO） */
  countryDisplay: string
  /** 国家代码（ISO） */
  countryCode?: string | null

  lat: number | null
  lng: number | null

  /** IP 前缀（ip_prefix） */
  cidr?: string
  asn?: number | string | null
  asnOrg?: string | null
}

// ============================================================
// API 调用函数
// ============================================================

/**
 * 1. 获取国家节点数量 (渲染瓦片/热力图)
 * GET /api/country-node-count
 */
export async function fetchCountryCounts(): Promise<CountryCountMap> {
  try {
    const res = await fetch('/api/country-node-count')
    if (!res.ok) throw new Error('Failed to fetch country counts')
    return await res.json()
  } catch (e) {
    console.error('[API] fetchCountryCounts error:', e)
    return {}
  }
}

/**
 * 2. 获取所有去重后的经纬度 (渲染地图上的点)
 * GET /api/nodes/coordinates
 */
export async function fetchMapCoordinates(): Promise<GeoCoordinate[]> {
  try {
    const res = await fetch('/api/nodes/coordinates')
    if (!res.ok) throw new Error('Failed to fetch coordinates')
    // 假设后端返回的是数组 [{latitude: 39, longitude: 116}, ...]
    const raw = await res.json()
    return Array.isArray(raw) ? raw : []
  } catch (e) {
    console.error('[API] fetchMapCoordinates error:', e)
    return []
  }
}

/**
 * 3. 获取表格数据 (支持分页和类型切换)
 * @param type 'forwarder' | 'resolver'
 * @param index 数据起始偏移量 (offset)
 * @param count 请求的数据条数 (limit)
 *
 * 新接口：GET /api/nodes-geo-map?node_type=forwarder&index=0&count=50
 */
export async function fetchNodeTableData(
  type: 'forwarder' | 'resolver',
  index: number,
  count: number
): Promise<{ items: IpGeoTableItem[]; total: number }> {
  // 统一使用新接口，并通过 node_type 区分
  const endpoint = '/api/nodes-geo-map'

  // 构造 URL 参数
  const url = `${endpoint}?node_type=${encodeURIComponent(
    type
  )}&index=${index}&count=${count}`

  try {
    const res = await fetch(url)
    if (!res.ok) throw new Error(`Failed to fetch table data: ${res.status}`)

    const data = (await res.json()) as NodeTableResponse
    const rawList = data.nodes || []
    const total = Number(data.total) || 0

    // 转换数据格式供前端表格展示
    const normalizeCountryDisplay = (name?: string): string => {
      const raw = (name || '').trim()
      if (!raw) return ''
      const lower = raw.toLowerCase()
      if (raw === '台湾' || lower === 'taiwan' || lower === 'tw') return '中国'
      return raw
    }

    const items: IpGeoTableItem[] = rawList.map((item) => {
      const latNum = Number(item.location?.latitude)
      const lngNum = Number(item.location?.longitude)

      const city =
        item.city?.name_zh_cn || item.city?.name || ''
      const countryName =
        item.country?.name_zh_cn ||
        item.country?.name ||
        item.country?.iso_code ||
        ''
      const countryDisplayName = normalizeCountryDisplay(countryName)
      const locationStr =
        city && countryDisplayName
          ? `${city} / ${countryDisplayName}`
          : city || countryDisplayName || '未知'

      const nodeTypeRaw = (item.node_type || type || '').toLowerCase()

      return {
        ip: item.ip,
        // 这里 label 存原始 node_type，displayTypeLabel 里再做中文映射
        label: nodeTypeRaw,
        forwarderIp: item.forwarder_ip || null,
        accessMethod: item.access_method || null,
        location: locationStr,
        countryDisplay: countryDisplayName,
        countryCode: item.country?.iso_code || null,
        lat: Number.isFinite(latNum) ? latNum : null,
        lng: Number.isFinite(lngNum) ? lngNum : null,
        cidr: item.network?.ip_prefix || '-',
        asn: item.network?.asn ?? null,
        asnOrg: item.network?.asn_organization || null
      }
    })

    return { items, total }
  } catch (e) {
    console.error('[API] fetchNodeTableData error:', e)
    return { items: [], total: 0 }
  }
}